package com.sz.biz.trade.ord.service;

import com.sz.biz.logistics.ord.entity.OrderDetail;
import com.sz.biz.trade.ord.dto.*;
import com.sz.biz.trade.ord.entity.TrdOrder;
import com.sz.biz.trade.ord.entity.TrdOrderDetail;
import com.sz.biz.trade.ord.entity.TrdOrderStatus;
import com.sz.biz.trade.bill.dto.TrdBillingGenerateDto;
import com.sz.common.base.dto.CommonModel;
import com.sz.common.base.dto.QResultDto;
import com.sz.common.base.dto.QueryParams;
import com.sz.common.core.system.entity.SysFile;

import java.io.IOException;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Date;
import java.util.List;

/**
 * Function: 贸易订单服务 <br>
 * Author: jifeixing <br>
 * Date: 2017-07-15 14:09:00
 */

public interface TrdOrderService {

    /**
     * 修改订单信息
     * @param trdOrder
     */
    void update(TrdOrder trdOrder);

    /**
     * 修改订单信息
     * @param trdOrder
     */
    void updateOrder(TrdOrder trdOrder);

    /**
     * 批量修改
     * @param orderNos
     * @param trdOrderStatus
     */
    void batchUpdateOrderStatus(List<String> orderNos, TrdOrderStatus trdOrderStatus);

    /**
     * 保存订单商品
     * @param orderGoods
     * @param orderNo
     * @param isCalculateAmount
     * @param orderChannel
     * @param vat
     * @return
     */
    BigDecimal saveOrderGoods(List<TrdOrderGoodsSaveDto> orderGoods, String orderNo, boolean isCalculateAmount, Integer orderChannel, BigDecimal vat);
    /**
     * 下单
     *
     * @param trdOrderDto
     * @return
     */
    String save(TrdOrderDto trdOrderDto) throws ParseException;

    /**
     * 客户平台下单
     * @param trdOrderDto
     * @return
     */
    String saveForCustomer(TrdOrderDto trdOrderDto) throws ParseException;

    /**
     * 所有订单类型
     *
     * @return
     */
    List<CommonModel> orderType();

    /**
     * 销售订单列表
     *
     * @param params
     * @return
     */
    QResultDto findByFilterSale(QueryParams params);

    /**
     * 采购订单列表
     * @param params
     * @return
     */
    QResultDto findByFilterPurchaser(QueryParams params);

    /**
     * 客户平台销售订单查询（客户订单查询）
     * @param params
     * @return
     */
    QResultDto findByFilterCustomerSale(QueryParams params);

    /**
     * 客户平台采购订单查询（供应商订单查询）
     * @param params
     * @return
     */
    QResultDto findByFilterCustomerPurchaser(QueryParams params);

    /**
     * 所有订单状态
     *
     * @return
     */
    List<CommonModel> orderStatus();

    /**
     * 根据订单号获取订单信息
     * @param orderNo
     * @return
     */
    TrdOrder findByOrderNo(String orderNo);

    /**
     * 根据订单号获取订单信息(销售订单)
     *
     * @param orderNo
     * @return
     */
    TrdOrderInfoDto findByOrderNoSale(String orderNo);

    /**
     * 根据订单号获取订单信息(采购订单)
     *
     * @param orderNo
     * @return
     */
    TrdOrderInfoDto findByOrderNoPurchaser(String orderNo);
    /**
     * 客户系统客户订单详情（销售订单）
     *
     * @param orderNo
     * @return
     */
    TrdOrderInfoCustomerDto findByOrderNoCustomerSale(String orderNo);
    /**
     * 客户系统供应商订单详情（采购订单）
     *
     * @param orderNo
     * @return
     */
    TrdOrderInfoCustomerDto findByOrderNoCustomerPurchaser(String orderNo);

    /**
     * 根据订单号删除
     *
     * @param orderNos
     * @param orderChannel 1:客户下单； 2： 平台代下单
     */
    void batchDeleteByOrderNos(List<String> orderNos, Integer orderChannel);

    /**
     * 编辑订单
     *
     * @param trdOrderDto
     * @param orderChannel
     */
    void update(TrdOrderDto trdOrderDto, Integer orderChannel);

    /**
     * 更新是否生成账单的字段
     *
     * @param orderNos orderNos
     * @param type     1销售账单 2采购账单
     * @param isBilled isBilled
     */
    void updateIsBilledStatus(List<String> orderNos, int type, boolean isBilled);

    /**
     * 根据订单号查询订单确认单
     * @param orderNo
     * @return
     */
    TrdOrderConfirmationInfoDto getConfirmationByOrder(String orderNo);

    /**
     * 根据订单号查询收货确认单
     * @param orderNo
     * @return
     */
    TrdOrderDeliveryInfoDto getDeliveryByOrder(String orderNo);

    /**
     * 统计可生成账单的单数
     *
     * @param type            1销售账单 2采购账单
     * @param bizCompanyIds   bizCompanyIds
     * @param platformIds     platformIds
     * @param startEffectTime startEffectTime
     * @param endEffectTime   endEffectTime
     */
    Integer countGenerateBillings(int type, List<Integer> bizCompanyIds, List<Integer> platformIds, Date startEffectTime, Date endEffectTime);

    /**
     * 获取订单
     * @param type            type
     * @param bizCompanyIds    bizCompanyIds
     * @param platformIds     platformIds
     * @param startEffectTime startEffectTime
     * @param endEffectTime   endEffectTime
     * @param isBilled        isBilled
     * @return List
     */
    List<TrdBillingGenerateDto> getOrderByCreatBillQuery(int type, List<Integer> bizCompanyIds, List<Integer> platformIds,
                                                                  Date startEffectTime, Date endEffectTime, boolean isBilled);

    /**
     * 根据订单确认单 生成 订单确认单pdf 并且上传之后 获取Sysfile
     *
     * @param trdOrderConfirmationInfoDto
     * @return
     */
    SysFile getPDFConfirmationByOrder(TrdOrderConfirmationInfoDto trdOrderConfirmationInfoDto);
    /**
     * 生成pdf 并且上传之后 获取Sysfile
     *
     * @param image 
     * @param type 
     * @param orderNo 
     * @return
     */
    String exportPDF(String image,String type,String orderNo)throws IOException;
    
    /**
     * 根据类型和HTML字符串生成PDF
     * @param type
     * @param orderNo
     * @param contentHtml
     * @return
     */
    PDFDto createPDFFile(String type,String orderNo,String contentHtml);

    boolean isNeedBuildPDF(TrdOrder trdOrder);

    /**
     * 需要直接修改订单状态为已签收的订单
     * @param orders
     */
    void signed(List<String> orders);

    List<TrdOrder> findByOrders(List<String> orders);

    TrdOrder findFullInfoByOrderNo(String orderNo);

    List<TrdOrder> findPurByReceiptTimeForRpt(Date dateBegin, Date dateEnd);

    List<TrdOrder> findSaleByReceiptTimeForRpt(Date dateBegin, Date dateEnd);
    List<TrdOrderDetail> getOrders();
}
